package com.bclz.schedule;

import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Properties;
import java.util.TimerTask;

import org.apache.commons.io.FileUtils;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import com.bclz.config.Constants;
import com.bclz.config.HadoopManager;
import com.bclz.config.LoadProperties;

/**
 * 
* @ClassName: CollectorTask  
* @Description: 采集任务  :
* 				1.构造一个定时器，采集日志;
* 				2.为了避免文件采集时应用服务器和日志服务器同时读，
* 					先将日志文件移动到/logs/toupload/,再进行采集;
* 				3.上传至hadoop后，在应用服务器建立备份文件夹/logs/backuplog/yyyy-MM-dd-HH
* @author xuchang  
* @date 2018年9月10日
 */
public class CollectorTask extends TimerTask {
	
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		Properties p=LoadProperties.loadHadoopConfig();
		
		FileSystem fs=HadoopManager.getFileSystem();
		
		//把目标文件夹拷贝到待上传目录
		File[] product=new File(p.getProperty(Constants.COLLECTOR_DIR_PRODUCT)).listFiles(s->{
			return s.getName().matches(".+?\\d{4}-\\d{2}-\\d{2}\\.\\d+?\\.log");
		});
		
		if(product.length==0) {
			System.out.println("NO Deal File");
		}else {
			
			File toupload=new File(p.getProperty(Constants.COLLECTOR_DIR_TOUPLOAD));
			
			//每小时生成备份文件
			String hoursFile=LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH"));
			
			File backup=new File(p.getProperty(Constants.COLLECTOR_DIR_BACKUP)+File.separator+hoursFile);
			System.out.println("待上传目录:"+toupload.getAbsolutePath());
			
			if(!backup.exists()) {
				backup.mkdirs();
			}
			if(!toupload.exists()) {
				toupload.mkdirs();
			}
			
			
			try {
				
				//移动到待上传目录
				for (File file : product) {
					FileUtils.copyFileToDirectory(file, toupload, true);
					if(!file.delete()) {
						System.out.println("删除失败:"+file.getAbsolutePath());
					}
				}
				
				//上传至服务器，以及备份文件
				File[] touploads=toupload.listFiles();
				
				if(!fs.exists(new Path("/test/logs"))) {
					fs.mkdirs(new Path("/test/logs"));
				}
				for (File file : touploads) {
					
					fs.copyFromLocalFile(new Path(file.getAbsolutePath()), new Path("/test/logs/"));
					File destFile=new File(backup,file.getName());
					if(destFile.exists()) {
						System.out.println(destFile.getName()+" Alreeady exists");
						destFile.delete();
					}
					FileUtils.moveFile(file, destFile);
				}
				fs.close();
				System.out.println("上传完成...");
			}catch(Exception e) {
				
				System.out.println(e.getMessage());
			}
			
			
			
		}
		
		
		
		
	}
	public static void main(String[] args) {
		System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH")));
	}

}
